package yz;

import java.util.Objects;

/**
 * [面试题 01.05. 一次编辑](https://leetcode-cn.com/problems/one-away-lcci/)
 *
 * <p>
 * * 字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串，编写一个函数判定它们是否只需要一次(或者零次)编辑。
 * <p/>
 *
 * @author Yz
 * @since 2022-09-20 19:39
 */
public class LeetCode0105_OneAway {
    public boolean oneEditAway(String first, String second) {
        if (Objects.equals(first, second)) {
            return true;
        }
        int m = first.length();
        int n = second.length();
        if (Math.abs(m - n) > 1) {
            return false;
        }
        if ((m == 1 && n == 0) || (n == 1 && m == 0)) {
            return true;
        }
        int num = 0;
        //替换
        if (m == n) {
            for (int i = 0; i < m; i++) {
                if (first.charAt(i) != second.charAt(i)) {
                    num++;
                }
            }
            return num <= 1;
        }
        if (m < n) {
            return oneEditAway(second, first);
        }
        //删除
        for (int i = 0; i < m; i++) {
            if (num == 0 && i < n) {
                if (first.charAt(i) != second.charAt(i)) {
                    num++;
                }
            } else {
                if (first.charAt(i) != second.charAt(i - 1)) {
                    num++;
                }
            }
        }
        return num <= 1;
    }
}
